package w83a.objects;

import java.io.Serializable;
import java.util.Locale;

public abstract class W83aBaseObject implements Serializable, Comparable{

	/**
	 * Serial version
	 */
	private static final long serialVersionUID = 385027792298587569L;
	
	/**
	 * Locale en el que se presentaran los datos en pantalla
	 */
	private Locale locale;
	private boolean compareByValueBol=false; // NOPMD by ifernandez on 5/3/10 1:58 PM
	

	/**
	 * Método que devuelve el idioma del locale. 
	 * @return Lenguaje del locale. Si el locale es nulo, devolverá lenguaje null.
	 */
	public String getLanguage() {
		if(this.locale == null){
			return null;
		}else{
			return this.locale.getLanguage();
		}
	}
	
	/**
	 * Método que asigna locale pasado como parámetro.
	 * @param locale Locale que asignamos al atributo locale de la clase.
	 */
	public void setLocale(Locale locale){
		this.locale = locale;
	}
	
	/**
	 * Método que devuelve el locale de la clase
	 * @return Locale de la clase.
	 */
	public Locale getLocale (){
		return this.locale;
	}
	
	/**
	 * Método abstracto que deben implementar las subclases, empleado para obtener el 
	 * valor de un campo identificador de una clase en la presentación.
	 * @return String con el valor del atributo id (campo identificador) de una clase.
	 */
	public abstract String getValue();
	
	/**
	 * Método abstracto que deben implementar las subclases, empleado para obtener el
	 * valor de un campo descriptivo de una clase. El valor de este campo dependerá del
	 * locale.
	 * @return String con el valor del atributo value (campo descriptivo) de una clase.
	 */
	public abstract String getId();
	
	/**
	 * Método que compara lexicográficamente este objeto W83aBaseObject con otro objeto W83aBaseObject 
	 * pasado como parámetro, atendiendo a su id.
	 * @param obj Objeto W83aBaseObject con el que se compara.
	 * @return Valor 0 si el valor es el mismo; valor menor que 0 si este objeto es menor que el pasado como parámetro; 
	 * valor mayor que 0 si este objeto es mayor que el objeto pasado como parámetro.
	 */
	public int compareById(W83aBaseObject obj){
		String s1 = (String)this.getId();
		String s2 = (String)obj.getId();

		return s1.toLowerCase().compareTo(s2.toLowerCase());
	}
	
	/**
	 * Método que compara lexicográficamente este objeto W83aBaseObject con otro objeto W83aBaseObject 
	 * pasado como parámetro, atendiendo a su value.
	 * @param obj Objeto W83aBaseObject con el que se compara.
	 * @return Valor 0 si el valor es el mismo; valor menor que 0 si este objeto es menor que el pasado como parámetro; 
	 * valor mayor que 0 si este objeto es mayor que el objeto pasado como parámetro.
	 */
	public int compareByValue(W83aBaseObject obj){
		String s1 = (String)this.getValue();
		String s2 = (String)obj.getValue();

		return s1.toLowerCase().compareTo(s2.toLowerCase());
	}

	/**
	 * @param o {@link Object}
	 * @return 0 o 1
	 */
	public int compareTo(Object o){
		if(this.compareByValueBol){
			return this.compareByValue((W83aBaseObject)o);
		}else{
			 return this.compareById((W83aBaseObject)o);
		}
	}

	/**
	 * @param theCompareByValue valor a comparar
	 */
	public void setCompareByValue(boolean theCompareByValue) {
		this.compareByValueBol = theCompareByValue;
	}

	/**
	 * @param obj {@link Object}
	 * @return boolean
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	public boolean equals(Object obj) {
		
		if(obj instanceof W83aBaseObject && obj.getClass().equals(this.getClass()) && this.getId() != null){
			 return this.getId().equals(((W83aBaseObject)obj).getId());			
		}else{
			return super.equals(obj);
		}
	}
}

